package com.topscomm.file.task;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;

import com.topscomm.basic.exception.ServiceException;
import com.topscomm.center.service.impl.FileManageService;
import com.topscomm.file.service.FileConvertFilter;
import com.topscomm.file.service.FileDownloadFilter;
import com.topscomm.file.service.FileTitlePageFilter;
import com.topscomm.file.service.FileUploadFilter;
import com.topscomm.file.service.IFileProcessFilter;
import com.topscomm.pub.util.SpringUtil;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * 文件处理任务
 * 
 * @description:
 * @author: donghang
 * @date: 2020年8月20日下午2:14:36
 * @modify:
 */
@Data
@Slf4j
public class FileProcessTask implements Callable<Boolean> {
	/**
	 * 消息对象
	 */
	private Map<String, Object> messageMap;

	/**
	 * 服务处理类
	 */
	private FileProcessChain fileProcessChain;

	public FileProcessTask(Map<String, Object> notification) {
		// 文件处理链
		List<IFileProcessFilter> filters = new ArrayList<IFileProcessFilter>();
		// 文件下载
		filters.add(new FileDownloadFilter());
		// 文件转换封面
		filters.add(new FileTitlePageFilter());
		// 文件转换
		filters.add(new FileConvertFilter());
		// 上传文件
		filters.add(new FileUploadFilter());
		// 文件最后处理
		// filters.add(new FileFinishFilter());
		this.fileProcessChain = new FileProcessChain(filters);
		this.messageMap = notification;
	}

	/**
	 * 
	 * @description: 通过责任链处理文件消息
	 * @return
	 * @throws Exception
	 * @author: donghang
	 * @date: 2020年1月14日上午10:21:31
	 * @modify:
	 */
	@Override
	public Boolean call() {
		FileManageService fileManageService = (FileManageService) SpringUtil.getBean("fileManageService");
		try {
			if (!this.fileProcessChain.doProcess(this.messageMap)) {
				log.info("文件处理完成：" + this.messageMap);
			}
			// 通知文件处理完成
			fileManageService.fileProcessFinish(this.messageMap);
			return true;
		} catch (Exception e) {
			log.error("文件处理失败：" + this.messageMap);
			// 通知文件处理失败
			fileManageService.fileProcessError(this.messageMap, e.getMessage());
			throw new ServiceException("文件处理失败");
		}

	}

}
